package InnerClass;
/*
         内部类:在类中定义的类
         成员访问:内部类可以直接访问外部类的成员,包括私有成员
                外部类需要创建对象访问,不能访问私有成员
         成员内部类:在类中定义的类
                    创建对象:外部类.内部类 对象名=new 外部类().new 内部类()
         静态内部类:使用static修饰的成员内部类
                    创建对象:外部类.内部类 对象名=new 外部类().内部类()
         局部内部类:
                    在方法中定义的成员内部类,方法调用才创建对象
         (**)匿名内部类:
                    在方法形参中定义的类,用来创建实例类或子类
                    创建对象:new 类/接口 (){} 通过该方法,会实现继承(实现)类(接口)

        lambda表达式: ()->{}
        作用:对于函数式接口(只有一个抽象方法的接口),使用lambda表达式,简化表达
        省略写法:
                1.对于参数类型,可以直接省略,如果只有一个参数,()也可以省略
                2.{}只有一句代码,可以省略大括号和分号,如{ ;},若代码是return语句,必须省略return

        lambda表达式与匿名内部类区别;
                lambda表达式:只能操作函数式接口(只有一个抽象方法的接口)
                匿名内部类:可以操作类和接口
 */
public class InnerClass {
    public static void main(String[] args) {
        A.B ab=new A().new B();
        A.C ac=new A.C();
        A a=new A();
        //匿名内部类
        a.print(new E(){
            @Override
            public void print() {
                System.out.println("重写匿名内部类..");
            }
        });
        //lambda表达式
        a.print(()->{System.out.println("重写匿名内部类..");});
    }

}
class A {
    //成员内部类
    class B{

    }
    //静态内部类
    static class C{

    }
    public void get(){
        //局部内部类
        class D{

        }
    }
    public void print(E e){
        System.out.println("匿名内部类..");
    }
}
interface E{
    public void print();
}